// 给所有的函数添加一个hycall的方法
Function.prototype.hycall = function (thisArg, ...args) {
  // 在这里可以去执行调用的那个函数
  // 问题:得可以获取到是哪一个函数执行了hycall


  // 1.获取需要被执行的函数
  var fn = this

  // 2.对thisArg转成对象类型 (防止它传入的是非对象类型) 并且判断边界情况
  thisArg = (thisArg !== null && thisArg !== undefined) ? Object(thisArg) : window

  // 3.调用需要被执行的函数
  thisArg.fn = fn
  var result = thisArg.fn(...args)
  delete thisArg.fn

  // 4.将最终的结果返回出去
  return result
}

function foo() {
  console.log('foo函数被执行', this);
}

function sum(num1, num2) {
  console.log('sum函数被执行', this, num1, num2);
  return num1 + num2
}


// 系统的函数的call方法
// foo.call('abc')

// 自己实现的函数的hycall方法
// 默认进行了隐式绑定
// foo.hycall({
//   name: 'why'
// })
// foo.hycall(123)
// foo.hycall('aaa')
// foo.hycall(null)
// foo.hycall(undefined)
// foo.hycall()

// var result = sum.call({}, 20, 30)
// console.log('系统调用的结果', result);

var result = sum.hycall('abc', 20, 30)
console.log('hycall调用', result);